/**
 * @brief applica i servizi offerti da bmp-tools per offrire semplici strumenti per il disegno del grafo
 *
 * graphbmp-tools.h
 *
 *  Created on: May 21, 2013
 *      Author: koldar
 */

#ifndef GRAPHBMP_TOOLS_H_
#define GRAPHBMP_TOOLS_H_

#include "bmp-tools.h"
#include "solution.h"
#include <math.h>

/**disegna un nodo del grafo. Il nodo e' rappresentanto da un quadrato di lato due volte radius
 * \pre
 *  \li img non NULL
 *  \li x appartiene a [0;W[
 *  \li y appartiene a [0;H[
 *  \li radius positivo o nullo
 * \post
 *  una forma rappresentante il nodo alle coordinate (x;y)
 *
 * @param img l'immagine su cui disegnare il nodo
 * @param x la coordinata x del centro del nodo
 * @param y la coordinata y del centro del nodo
 * @param radius il raggio del nodo
 * @param color il colore con cui riempire la forma del nodo
 */
void drawNode(Pimage img,int x, int y,int radius,RGB color);

/** disegna tutti i nodi del grafo. Essi vengono disposti lungo una circonferenza avente come centro il centro dell'immagine: in
 * questo modo aumentando il numero di nodi il grafo e' comunque abbasrtanza leggibile
 *
 * \pre
 *  \li img non NULL
 *  \li N non negativo
 *  \li graphradius non negativo e strettamente minore della meta' del minimo tra la lunghezza e l'altezza dell'immagine
 *  \li noderadius non negativo e "piccolo" rispetto a graphradius
 *  \li
 * \post
 *  \li gli N nodi vengono disposti su una circonferenza centrata al centro dell'immagine di raggio graphradius
 *  \li i numero dei nodi vengono disposti su una circonferenza centrata al centro dell'immagine di raggio graphradius-nodenumbergap*noderadius
 *
 * @param img indica l'immagine da modificare
 * @param N il numero di nodi di cui e' composto il grafo
 * @param graphradius il raggio della circonferenza su cui sono disposti i nodi
 * @param noderadius il raggio di ogni singolo nodo del grafo
 * @param depot il nodo deposito del grafo
 * @param nodenumbergap un indicatore della distanza tra la circonferenza su cui stanno i nodi e quella su cui stanno i numeri
 * @param digitgap indica la distanza che intercorre tra le cifre che compongono il numero di un nodo (in nodeRadius)
 * @param numberheight l'altezza di una cifra di un nodo (rapportata a noderadius)
 * @param numberwidth la lunghezza di una cifra di un nodo (rapportata a noderadius)
 * @param numberradius indica, come unita' di misura il nodradius scelto, di quanto e' minore il raggio della circonferenza su cui sono disposti i numeri identificativi dei nodi rispetto a graphradius
 * @param numbercolor indica il colore con cui colorare i numeri dei nodi
 * @param normalcolor indica il colore con cui colorare i nodi
 * @param depotcolor indica il colore con cui colorare il deposito
 */
void drawNodes(Pimage img,int N,float graphradius,float noderadius, int depot,float nodenumbergap,int digitgap, int numberheight, int numberwidth, int numberradius,RGB numbercolor, RGB normalcolor,RGB depotcolor);

/**disegna la soluzione passata sul file f. Il resto dei parametri sono opzioni grafiche
 *
 * \pre
 *  \li f non e' NULL ed e' stato aperto in lettura (fopen(file,"r"); )
 *  \li solution non NULL
 *  \li depotnode compreso tra 0 (incluso) e il numero di nodi della soluzione
 *  \li ogni parametro intero deve essere positivo (o nullo)
 * \post
 *  \li f correttamente chiuso
 *  \li f interpretabile come un'immagine bitmap
 *  \li f contiene una rappresentazione grafica della soluzione solution
 *
 * @param f il file su cui disegnare
 * @param solution indica la soluzione da disegnare
 * @param depotnode il nodo deposito della soluzione
 * @param nodeRadius il raggio di ogni nodo da disegnare
 * @param nodeGap un parametro che approssima la distanza minima che devono avere i nodi tra di loro
 * @param nodeNumberGap un indicatore di quanto e' distante la circonferenza su cui stanno i nodi da quella su cui stanno i numeri
 * @param digitGap un parametro che gestisce la distanza tra le cifre di uno stesso numero di un nodo (in nodeRadius)
 * @param numberHeight l'altezza (in nodeRadius) delle cifre del numero del nodo
 * @param NumberWidth la lunghezza (in nodeRadius) delle cifre del numero del nodo
 * @param numberRadius il raggio della linea che compone il numero di un nodo
 * @param numberColor il colore dei numeri dei nodi
 * @param nodeColor il colore di un nodo
 * @param depotColor il colore del nodo deposito
 */
void drawSolution(FILE* f,Psolution solution,int depotnode,int nodeRadius,int nodeGap,int nodeNumberGap,int digitGap,int numberHeight,int NumberWidth,int numberRadius,RGB numberColor,RGB nodeColor, RGB depotColor);
/**disegna la soluzione passata sul file f. Il resto dei parametri sono opzioni grafiche
 *
 * \pre
 *  \li solution non NULL
 *  \li depotnode compreso tra 0 (incluso) e il numero di nodi della soluzione
 *  \li ogni parametro intero deve essere positivo (o nullo)
 * \post
 *  \li creato un file nella stessa directory in cui si trova l'applicativo che lo usa se il file non esisteva, riscritto se gia' ne esisteva uno
 *  \li file correttamente chiuso
 *  \li file interpretabile come un'immagine bitmap
 *  \li file contiene una rappresentazione grafica della soluzione solution
 *
 * @param f il nome del file (eventualmente da creare) su cui disegnare
 * @param solution indica la soluzione da disegnare
 * @param depotnode il nodo deposito della soluzione
 * @param nodeRadius il raggio di ogni nodo da disegnare
 * @param nodeGap un parametro che approssima la distanza minima che devono avere i nodi tra di loro
 * @param nodeNumberGap un indicatore di quanto e' distante la circonferenza su cui stanno i nodi da quella su cui stanno i numeri
 * @param digitGap un parametro che gestisce la distanza tra le cifre di uno stesso numero di un nodo (in nodeRadius)
 * @param numberHeight l'altezza (in nodeRadius) delle cifre del numero del nodo
 * @param NumberWidth la lunghezza (in nodeRadius) delle cifre del numero del nodo
 * @param numberRadius il raggio della linea che compone il numero di un nodo
 * @param numberColor il colore dei numeri dei nodi
 * @param nodeColor il colore di un nodo
 * @param depotColor il colore del nodo deposito
 */
void drawSolutionFromScratch(char* fileName,Psolution solution,int depotnode,int nodeRadius,int nodeGap,int nodeNumberGap,int digitGap,int numberHeight,int NumberWidth,int numberRadius,RGB numberColor,RGB nodeColor, RGB depotColor);

/** Wrappa drawSolutionFromScratch hardcodando perchè pat ODIA infiniti prototipi numerici.
 */
void drawSolutionFromScratchDefaults(char* fileName, Psolution ps, int depotnode);

/**trasforma le coordinate polari di un punto (graphradius come rho e n come theta) in coordinate cartesiane.
 *
 * \pre
 *  \li  x e y non sono NULL
 *  \li widthBMP, heightBMP e graph radius sono strettamente positivi
 *
 * @param N il numero di nodi; grazie ad esso e' possibile stabilire qual'e l'angolo base (2PI/N)
 * @param n il numero del nodo di cui si vogliono reperire le coordinate cartesiane
 * @param graphradius il raggio della circonferenza
 * @param widthBMP la lunghezza della bitmap
 * @param heightBMP l'altezza della bitmap
 * @param x l'area di memoria in cui collocare la coordinata cartesiana che esprime l'ascissa del punto
 * @param y l'area di memoria in cui collocare la coordinata cartesiana che esprime l'ordinata del punto
 */
void getXYBMP(int N,int n,float graphradius,int widthBMP,int heightBMP,int* x, int*y);

/**disegna una linea che parte da un nodo from e arriva ad un nodo to
 *
 * @param img l'immagine su cui disegnare sopra
 * @param N il numero di nodi totali del grafo
 * @param graphRadius il raggio della circonferenza su cui sono collocati i nodi
 * @param from il primo nodo da cui parte la linea
 * @param to il secondo nodo a cui arriva la linea
 * @param lineradius il raggio della linea da disegnare
 * @param color il colore della linea da disegnare
 */
void drawNodeLine(Pimage img, int N,int graphRadius,int from, int to, int lineradius, RGB color);

#endif /* GRAPHBMP_TOOLS_H_ */
